문제 #

외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.

제한사항 #

중복된 원소는 없습니다. 1 ≤ emergency의 길이 ≤ 10 1 ≤ emergency의 원소 ≤ 100

입출력 예 #

emergency result
[3, 76, 24] [3, 1, 2]
[1, 2, 3, 4, 5, 6, 7] [7, 6, 5, 4, 3, 2, 1]
[30, 10, 23, 6, 100] [2, 4, 3, 5, 1]

입출력 예 설명 #

입출력 예 #1

emergency가 [3, 76, 24]이므로 응급도의 크기 순서대로 번호를 매긴 [3, 1, 2]를 return합니다.

풀이 #


function solution(emergency) {
    const bst = new BST();
    for (let i = 0; i < emergency.length; i++) {
        bst.insert(i, emergency[i]);
    }
    
    bst.reverseInOrder(bst.root);
    
    let answer = [];
    for (let i = emergency.length; i > 0; i--) {
        answer[bst.res[i - 1]] = i;
    }
    return answer;
}

class N {
  constructor(index, val) {
    this.index = index;
    this.val = val;
    this.left = null;
    this.right = null;
  }
}

class BST {
  constructor() {
    this.root = null;
    this.res = [];
  }
    
  insert(index, val) {
    const newNode = new N(index, val);
    if (!this.root) {
      this.root = newNode;
    } else {
      this.insertNode(this.root, newNode);
    }
  }

  insertNode(node, newNode) {
    if (newNode.val < node.val) {
      if (!node.left) node.left = newNode;
      else this.insertNode(node.left, newNode);
    } else {
      if (!node.right) node.right = newNode;
      else this.insertNode(node.right, newNode);
    }
  }
    
  reverseInOrder(node) {
    if (!node) return;
    this.reverseInOrder(node.right);
    this.res.push(node.index);
    this.reverseInOrder(node.left);
  }

}

후술 #

위 풀이는 효율적이지 않습니다. 일반 BST를 사용하여, 입력되는 인자에 따라 insert 함수는 최악의 경우 O(n^2)의 시간을 소비합니다.

AVL 트리, 레드-블랙 트리 등을 사용하면 𝑂(log 𝑛)으로 시간을 줄일 수 있습니다.

배열을 sort하는 방식은 𝑂(𝑛 log 𝑛)의 시간 복잡도를 가지므로 더 간단한 해결법이 됩니다.

다만, 위와 같이 풀이한 이유는 평소 트리를 직접 구현할 일이 많이 없고, reverseInOrder로도 문제가 풀릴 것 같아서 시도해봤습니다. 감사합니다.